package b3_xac_dinh_nguon_goc_tin_don;

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

import b1_xay_dung_tap_du_lieu_mau.User;

public class Kha_nang_lan_truyen_den_tap_giam_sat_duong {
	static List<User> final_list;
	static int[] pre_node = new int[7500];

	/**
	 * 
	 * @param list_user
	 *            danh sách tất cả người dùng
	 * @param list_gs_d
	 *            danh sách tập node giám sát dương
	 * @return khả năng lan truyền đến tập node gs dương sẽ được lưu luôn vào
	 *         list node đầu vào, do đối tượng user có thuộc tính boolean
	 *         lien_ket_den_tap_gs_duong
	 */
	public static void kha_nang_lt_den_tap_gs_duong(List<User> list_user,
			List<User> list_gs_d) {

		// Đánh dấu các node là giám sát dương trong list user
		for (int i = 0; i < list_gs_d.size(); i++) {
			list_user.get(list_gs_d.get(i).id).flag_monitor = 1;
		}
		final_list = list_user;
		A(72);
		for (int i = 0; i < final_list.size(); i++) {
			System.out.println("id: " + list_user.get(i).id + " ++ "
					+ list_user.get(i).has_rumour);
		}
		int x=2148;
		System.out.println("PATH: ");
		while(x!=72){
			System.out.print(x+"<-");
			x = pre_node[x];
		}
	}

	private static void A(int index) {
		Queue<User> queue = new LinkedList<User>();
		queue.add(final_list.get(index));
		pre_node[index] = index;
		int count = 0;
		while (!queue.isEmpty()) {

			int x = (queue.peek().id);
			final_list.get(x).has_rumour = true;

			for (int i = 0; i < final_list.get(x).list_id_user_RT.size(); i++) {
				if (final_list.get(final_list.get(x).list_id_user_RT.get(i)).has_rumour == false
						&& !queue
								.contains(final_list.get(final_list.get(x).list_id_user_RT
										.get(i)))) {
					queue.add(final_list.get(final_list.get(x).list_id_user_RT
							.get(i)));
					pre_node[final_list.get(x).list_id_user_RT.get(i)] = final_list
							.get(x).id;
					count++;
					System.out.println("ts: " + count);
				}
			}
			queue.poll();
		}
	}
}
